畫布效果。
先在HTML上使用<canvas>
並規定範圍
<canvas id="draw" width="800" height="800"></canvas>
抓取節點後建立監聽
const canvas = document.querySelector('#draw');
canvas.addEventListener('mousedown', () => { //滑鼠按下觸發
})
canvas.addEventListener('mousemove', () => { //滑鼠移動
})
canvas.addEventListener('mouseup', () => { //滑鼠放開觸發
})
canvas.addEventListener('mouseout', () => { //滑鼠移開
})
加上繪圖的狀態控制項
let drawing = false;//不能立刻開始繪圖
canvas.addEventListener('mousedown', () => {
//滑鼠按下觸發
drawing =true;//開始繪圖
})
canvas.addEventListener('mousemove', () => {
//滑鼠移動
if (!drawing) { //狀態是false就不繼續執行
return
}
console.log('draw')
})
canvas.addEventListener('mouseup', () => {
//滑鼠放開觸發
drawing =false;//停止繪圖
})
canvas.addEventListener('mouseout',() => {
//滑鼠移開
drawing = false //停止繪圖
})
此時可以在畫布上實驗,只有按住滑鼠移動才會觸發 console.log,放開滑鼠則停止。
呼叫getContext()方法,可依MDN上的介紹按需求調整參數
let ctx = canvas.getContext('2d');
加入各項要素調整線條內容
ctx.strokeStyle ='hsl(0,100%,50%)';//線條初始顏色
ctx.lineWidth = 100;//線條粗細
ctx.lineCap = 'round';//末端 - 圓角
ctx.lineJoin = "round";//轉折角- 圓角
開始製作繪圖效果
let x = 0,
y = 0; // 點連到點就會連成線
canvas.addEventListener('mousedown', e => {
//滑鼠按下觸發
drawing = true; //開始繪圖
[x, y] = [e.offsetX, e.offsetY];//座標
});
canvas.addEventListener('mousemove', () => {
//滑鼠移動
if (!drawing) {
//狀態是false就不繼續執行
return;
}
// console.log('draw');//確認觸發
ctx.beginPath();//開始繪圖
ctx.moveTo(x, y); //移動到所點擊的位置
ctx.lineTo(e.offsetX, e.offsetY); //連到現在的位置
[x, y] = [e.offsetX, e.offsetY];
ctx.stroke();//繪製
});
以上設定好後已經可以繪製,可以到畫面測試是否成功
加入自動變色
let colorDeg = 0; //存放顏色
ctx.strokeStyle = `hsl(${colorDeg},100%,50%)`; //線條初始顏色
canvas.addEventListener('mousemove', e => {
//滑鼠移動
(略)
colorDeg = colorDeg < 360 ? colorDeg + 1 : 0;
//如果小於360就+1,已經是360就變成0
ctx.strokeStyle = `hsl(${colorDeg},100%,50%)`;
(略)
});
改變線條粗細
let lineWidth = 30;
let direction =-1;//方向
ctx.lineWidth = lineWidth; //線條粗細
canvas.addEventListener('mousemove', e => {
//滑鼠移動
(略)
// 粗細調整
// lineWidth = lineWidth < 100 ? lineWidth + 1 : 50;//這樣的效果不同
if (lineWidth < 1 || lineWidth > 100) { //臨界點切換
direction *= -1;
}
lineWidth+=direction;
ctx.lineWidth = lineWidth;
(略)
});
透明度調整
let colorDeg = 0; //存放顏色
let alpha = 1; //透明度
let alphaDirection = 0.1; //透明度調整
ctx.strokeStyle = `hsla(${colorDeg},100%,0%,${alpha})`; //線條初始顏色
canvas.addEventListener('mousemove', e => {
//滑鼠移動
(略)
// 顏色調整
colorDeg = colorDeg < 360 ? colorDeg + 1 : 0;
//如果小於360就+1,已經是360就變成0
if (alpha < 0.25 || alpha > 1) {
//臨界點切換
alphaDirection *= -1;
}
alpha += alphaDirection;
ctx.strokeStyle = `hsla(${colorDeg},100%,70%,${alpha})`;
(略)
});
超出畫面後回來的筆觸接續,全部監聽都要修改
//雙重判斷
let drawing = false; //不能立刻開始繪圖
let down = false; //是否點擊滑鼠
canvas.addEventListener('mousedown', e => {
//滑鼠按下觸發
// drawing = true; //開始繪圖
down = true;
[x, y] = [e.offsetX, e.offsetY]; //座標
});
canvas.addEventListener('mousemove', e => {
//滑鼠移動
// if (!drawing) {
if (!down || !drawing) {
//狀態是false就不繼續執行
return;
}
// console.log('draw');//確認觸發
ctx.beginPath(); //開始繪圖
// 顏色調整
colorDeg = colorDeg < 360 ? colorDeg + 1 : 0;
//如果小於360就+1,已經是360就變成0
if (alpha < 0.25 || alpha > 1) {
//臨界點切換
alphaDirection *= -1;
}
alpha += alphaDirection;
ctx.strokeStyle = `hsla(${colorDeg},100%,70%,${alpha})`;
// 粗細調整
// lineWidth = lineWidth < 100 ? lineWidth + 1 : 50;//這樣的效果不同
if (lineWidth < 1 || lineWidth > 50) {
//臨界點切換
direction *= -1;
}
lineWidth += direction;
ctx.lineWidth = lineWidth;
ctx.moveTo(x, y); //移動到所點擊的位置
ctx.lineTo(e.offsetX, e.offsetY); //連到現在的位置
[x, y] = [e.offsetX, e.offsetY];
ctx.stroke(); //繪製
});
document.addEventListener('mouseup', () => {
//任何地方放開都取消
//滑鼠放開觸發
// drawing = false; //停止繪圖
down = false;
});
// canvas.addEventListener('mouseout', () => {
// //滑鼠移開
// drawing = false; //停止繪圖
// });
canvas.addEventListener('mouseleave', () => {
//滑鼠移開
drawing = false; //停止繪圖
});
canvas.addEventListener('mouseenter', e => {
//滑鼠移動到元素上
drawing = true;
[x, y] = [e.offsetX, e.offsetY];
});